/**
 * 完整工作流程示例
 * 演示从上传代码包到发布小程序的完整流程
 */

const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const path = require('path');

// 服务配置
const API_BASE_URL = 'http://localhost:3000';
const API_SECRET_KEY = 'yueqiankejiyueqiankejiyueqiankeji';

/**
 * 小程序管理器类
 */
class MiniProgramManager {
    constructor(baseUrl = API_BASE_URL) {
        this.baseUrl = baseUrl;
    }

    /**
     * 健康检查
     */
    async checkHealth() {
        try {
            const response = await axios.get(`${this.baseUrl}/health`);
            return response.data.success;
        } catch (error) {
            console.error('健康检查失败:', error.message);
            return false;
        }
    }

    /**
     * 上传文件
     * @param {string} filePath 文件路径
     */
    async uploadFile(filePath) {
        try {
            if (!fs.existsSync(filePath)) {
                throw new Error(`文件不存在: ${filePath}`);
            }

            console.log(`📁 开始上传文件: ${filePath}`);
            
            const formData = new FormData();
            formData.append('file', fs.createReadStream(filePath));
            
            const response = await axios.post(`${this.baseUrl}/upload-file`, formData, {
                headers: {
                    ...formData.getHeaders(),
                    'X-API-Key': API_SECRET_KEY
                },
                timeout: 60000 // 1分钟超时
            });
            
            console.log('✅ 文件上传成功:', response.data.data.folderName);
            return response.data.data;
        } catch (error) {
            console.error('❌ 文件上传失败:', error.response?.data || error.message);
            throw error;
        }
    }

    /**
     * 获取文件夹列表
     */
    async getFolders() {
        try {
            const response = await axios.get(`${this.baseUrl}/folders`, {
                headers: {
                    'X-API-Key': API_SECRET_KEY
                }
            });
            return response.data.data;
        } catch (error) {
            console.error('获取文件夹列表失败:', error.response?.data || error.message);
            throw error;
        }
    }

    /**
     * 上传代码到微信
     * @param {Object} config 上传配置
     */
    async uploadToWeChat(config) {
        try {
            console.log(`🚀 开始上传到微信: ${config.appid}`);
            
            const response = await axios.post(`${this.baseUrl}/upload`, config, {
                headers: {
                    'X-API-Key': API_SECRET_KEY
                },
                timeout: 300000 // 5分钟超时
            });
            
            console.log('✅ 微信上传成功:', response.data.data);
            return response.data.data;
        } catch (error) {
            console.error('❌ 微信上传失败:', error.response?.data || error.message);
            throw error;
        }
    }
}

/**
 * 示例1: 单个小程序完整流程
 */
async function example1_singleMiniProgram() {
    console.log('\n=== 示例1: 单个小程序完整流程 ===');
    
    const manager = new MiniProgramManager();
    
    // 检查服务健康状态
    if (!await manager.checkHealth()) {
        console.error('❌ 服务不可用，请检查服务是否启动');
        return;
    }

    try {
        // 模拟上传结果
        const uploadResult = {
            folderName: 'code_1703123456789',
            timestamp: 1703123456789,
            originalName: 'test-miniprogram.zip'
        };

        // 配置微信上传参数
        const wxConfig = {
            appid: 'wx1234567890abcdef',
            privateKey: 'REPLACE_WITH_REAL_PRIVATE_KEY',
            backendDomain: 'api.example.com',
            uniacid: 123,
            entryPagePath: 'pages/index/index',
            folderName: uploadResult.folderName
        };

        console.log('⚠️ 请替换为真实的配置参数后测试微信上传功能');
        
    } catch (error) {
        console.error('示例1执行失败:', error.message);
    }
}

/**
 * 示例2: 多个小程序管理
 */
async function example2_multiMiniPrograms() {
    console.log('\n=== 示例2: 多个小程序管理 ===');
    
    const manager = new MiniProgramManager();
    
    // 定义多个小程序配置
    const programs = [
        {
            name: '用户端小程序',
            appid: 'wx_user_12345',
            backendDomain: 'api-user.example.com',
            uniacid: 101,
            entryPagePath: 'pages/index/index'
        },
        {
            name: '商家端小程序',
            appid: 'wx_merchant_12345',
            backendDomain: 'api-merchant.example.com',
            uniacid: 102,
            entryPagePath: 'pages/home/home'
        }
    ];

    try {
        for (const program of programs) {
            console.log(`\n处理: ${program.name}`);
            
            // 模拟上传结果
            const uploadResult = {
                folderName: `code_${Date.now()}`,
                timestamp: Date.now()
            };
            
            console.log(`📁 ${program.name} 代码包上传完成: ${uploadResult.folderName}`);
            console.log(`🚀 ${program.name} 准备上传到微信`);
            
            // 延迟一下，避免频繁请求
            await new Promise(resolve => setTimeout(resolve, 1000));
        }
        
    } catch (error) {
        console.error('多小程序管理失败:', error.message);
    }
}

/**
 * 主函数
 */
async function main() {
    console.log('🎯 小程序管理完整工作流程示例');
    console.log('请确保上传服务已启动: npm start\n');

    try {
        await example1_singleMiniProgram();
        await example2_multiMiniPrograms();
    } catch (error) {
        console.error('示例运行失败:', error);
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    main();
}

module.exports = {
    MiniProgramManager,
    example1_singleMiniProgram,
    example2_multiMiniPrograms
}; 